package itheima.Healthy;

import java.text.DecimalFormat;
import java.util.Scanner;

public class HuaiYaHealthy {
    public static void main(String[] args) {
        // 1.录入用户信息
        // 1.1.创建Scanner对象
        Scanner scanner = new Scanner(System.in);
        // 1.2 录入升高
        System.out.print("请输入升高（cm）：");
//        short height = scanner.nextShort();
        short height = 0;
        while (true){
            height =  scanner.nextShort();
           if (height >= 140 && height <= 250){
               System.out.println("输入成功");
               break;
           };
           System.out.println("输入错误，请重新输入一个140cm-250cm之间的值！");
       }
        // 1.3 录入体重
        System.out.print("请输入体重（kg）：");
//        double weight = scanner.nextDouble();
        double weight = 0;
        while (true){
            weight = scanner.nextDouble();
            if (weight >= 40 && weight <= 200){
                System.out.println("输入成功");
                break;
            }
            System.out.println( "输入错误，请重新输入一个40kg-200kg之间的值！");
        }
        // 1.4 录入年龄
        System.out.print("请输入年龄（岁）：");
//        byte age = scanner.nextByte();
        byte age = 0;
        while (true){
            age = scanner.nextByte();
            if (age >= 18 && age <= 70){
                System.out.println("输入成功");
                break;
            }
            System.out.println("输入错误，请重新输入一个18-70之间的值！");
        }
        // 1.5 录入性别
        System.out.print("请输入性别（0：男/1：女）：");
/*        //String sex = scanner.next();
        byte sex = scanner.nextByte();*/
        byte sex = 0;
        while (true){
            sex = scanner.nextByte();
            if (sex == 0 || sex == 1){
                System.out.println("输入成功");
                break;
            }
            System.out.println("输入错误，请重新输入0或1！");
        }
        // 1.6 录入活动级别
        System.out.print("请输入活动级别（0：久坐/1：轻度/2：中度/3：高度）：");
/*        //String activityLevel = scanner.next();
        byte activityLevel = scanner.nextByte();*/
        byte activityLevel = 0;
        while (true){
            activityLevel = scanner.nextByte();
            if (activityLevel >= 0 && activityLevel <= 3){
                System.out.println("输入成功");
                break;
            }
            System.out.println("输入错误，请重新输入一个0-3之间的一个整数！");
        }

        // 2.计算MBMI，并且判断体型，设定运动目标
        double heightINMeters =  height / 100.0;
        // 2.1计算BMI
        double bmi = weight / (heightINMeters * heightINMeters);
        // 2.2判断体型
        String bodyType = "";
        if (bmi < 18.5) {
            bodyType = "偏瘦";
        } else if (bmi >= 18.5 && bmi < 24) {
            bodyType = "正常";
        } else if (bmi >= 24 && bmi < 28) {
            bodyType = "超重";
        } else {
            bodyType = "肥胖";
        }
        //不能用switch的原因： Java 的 switch 语句设计之初就仅支持离散的、可列举的值类型（如 int），而不支持浮点数（如 double 或 float）。这是因为浮点数具有连续性，并且存在精度问题，不适合用于 switch 的精确匹配机制。
        //范围判断的，多分值的，还是用if else if else if else else
        // 2.3设定运动目标
        String goal = switch (bodyType) {
            case "偏瘦" ->  "增肌";
            case "超重" , "肥胖" -> "减重";
            default -> "保持";
        };
        /*if (bodyType.equals("偏瘦")) {
            goal = "增肌";
        } else if (bodyType.equals("超重") ||  bodyType.equals("肥胖")) {
            goal = "减重";
        } else {
            goal = "保持";
        }*/
        // BMI小数约束方法1
        DecimalFormat df = new DecimalFormat("0.0");
        System.out.println("您的BMI是：" + df.format(bmi) + "，体型是：" + bodyType);
        System.out.println("运动目标：" + goal + "，加油！");
        //方法2
        /*System.out.println(String.format("BMI:%.1f",bmi));*/

        // 3.计算每日摄入热量建议，包括BMR、TDEE、每日热量
        // 3.1 计算BMR 每日基础代谢率
        /*double bmr = 0;// 一定要提前定义，不能只在if里面定义，不然为了计算tdee引用bmr时会出错
        if (sex == 0) {
            // 男性计算
            bmr = 88.362  + (13.397 * weight) + (4.799 * height) - (5.677 * age);
        } else {
            // 女性计算
            bmr = 447.593 + (9.247 * weight) + (3.098 * height) - (4.330 * age);
        }*/
        double bmr = sex == 0 ?
                88.362  + (13.397 * weight) + (4.799 * height) - (5.677 * age) :
                447.593 + (9.247 * weight) + (3.098 * height) - (4.330 * age);
        // 3.2计算tdee 总能量消耗
        /*double activityFactor = 0;
        if (activityLevel == 0) {
            activityFactor = 1.2;
        } else if (activityLevel == 1) {
            activityFactor = 1.375;
        } else if (activityLevel == 2) {
            activityFactor = 1.55;
        } else {
            activityFactor = 1.725;
        }*/
        double activityFactor = switch (activityLevel){
            case 0 -> 1.2;
            case 1 -> 1.375;
            case 2 -> 1.55;
            default -> 1.725;
        };
        double tdee = bmr * activityFactor;
        // 3.3计算每日摄入热量
        /*double dailyCalories = tdee;
        if (goal.equals("增肌")) {
            dailyCalories += 300;
        } else if (goal.equals("减重")) {
            dailyCalories -= 300;
        } else {
            dailyCalories += 0;
        }*/
        double dailyCalories = switch (goal) {
            case "增肌" -> tdee + 300;
            case "减重" -> tdee - 300;
            default -> tdee;
        };

        // 4.计算每日摄入的营养素的质量
        double protein = dailyCalories * 0.3 / 4;
        double fat = dailyCalories * 0.2 / 9;
        double carbohydrate = dailyCalories * 0.5 / 4;

        // 5.打印结果
        System.out.println("============饮食计划============");
        System.out.println("您的每日基础代谢为：" + (int)bmr + "kcal,结合运动后的总代谢：" + (int)tdee + "kcal");// 输出强转
        System.out.println("结合您的运动目标，建议你每日摄入的能量为：" + (int)dailyCalories + "kcal，其中：");
        System.out.println("蛋白质：" + (int)protein + "克" );
        System.out.println("脂肪：" + (int)fat + "克" );
        System.out.println("碳水化合物：" + (int)carbohydrate + "克" );
        System.out.println("以上是健康饮食建议，祝您生活愉快！");
        System.out.println("===============================");
    }
}
